import {v4 as uuidv4} from 'uuid';

/**
 * 生成UUID
 * @returns
 */
export const getUUID = () => {
    return uuidv4()
}

/**
 * 将对象转url参数
 * @param {*} query
 * @returns
 */
export function useQueryToString(query = {}) {
    let q = ''
    for (const key in query) {
        if (q == '') {
            q = `?${key}=${query[key]}`
        } else {
            q += `&${key}=${query[key]}`
        }
    }
    return q
}

/**
 * 回车事件
 * @param {*} callback
 */
export const useEneterEvent = (callback) => {
    function handleEnterEvent(e) {
        if (e.key === "Enter") {
            callback()
            // 取消事件的默认行为
            e.preventDefault();
        }
    }

    // 比如进入登录页面就开始给document绑定键盘事件，绑定的事件是：handleEnterEvent
    onBeforeMount(() => {
        document.addEventListener("keydown", handleEnterEvent)
    })

    // 监听页面离开就必须把document的键盘事件取消，因为除了登录注册页面需要敲键盘enter提交。其他页面是不需要的。
    // 所以你必须要解绑，否则就造成其他的页面都有键盘事件。就不对了
    onUnmounted(() => {
        document.removeEventListener("keydown", handleEnterEvent)
    })
}


// 对Date的扩展，将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
// eslint-disable-next-line no-extend-native
Date.prototype.Format = function (fmt) {
    var o = {
        'M+': this.getMonth() + 1, // 月份
        'd+': this.getDate(), // 日
        'h+': this.getHours(), // 小时
        'm+': this.getMinutes(), // 分
        's+': this.getSeconds(), // 秒
        'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
        'S': this.getMilliseconds() // 毫秒
    }
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length))
    }
    for (var k in o) {
        if (new RegExp('(' + k + ')').test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
        }
    }
    return fmt
}

/**
 * 日期格式化
 * @param times
 * @param pattern
 * @returns {string}
 */
export function formatTimeToStr(times, pattern = 'yyyy-MM-dd hh:mm:ss') {
    var d = new Date(times).Format(pattern)
    return d.toLocaleString()
}

/**
 * 时间转换
 * @param timespan
 * @returns {string}
 */
export function formatMsgTime(timespan) {
    var dateTime = new Date(timespan);
    var year = dateTime.getFullYear();
    var month = dateTime.getMonth() + 1;
    var day = dateTime.getDate();
    var hour = dateTime.getHours();
    var minute = dateTime.getMinutes();
    var second = dateTime.getSeconds();
    var now = new Date().getTime();
    var milliseconds = 0;
    var timeSpanStr;
    milliseconds = now - dateTime.getTime();
    // 一分钟前，为刚刚
    if (milliseconds <= 1000 * 60 * 1) {
        timeSpanStr = '刚刚';
    } else if (1000 * 60 * 1 < milliseconds && milliseconds <= 1000 * 60 * 60) {
        timeSpanStr = Math.round((milliseconds / (1000 * 60))) + '分钟前';
    } else if (1000 * 60 * 60 * 1 < milliseconds && milliseconds <= 1000 * 60 * 60 * 24) {
        timeSpanStr = Math.round(milliseconds / (1000 * 60 * 60)) + '小时前';
    } else if (1000 * 60 * 60 * 24 < milliseconds && milliseconds <= 1000 * 60 * 60 * 24 * 15) {
        timeSpanStr = Math.round(milliseconds / (1000 * 60 * 60 * 24)) + '天前';
    } else if (milliseconds > 1000 * 60 * 60 * 24 * 15 && year == new Date().getFullYear()) {
        timeSpanStr = month + '-' + day + ' ' + hour + ':' + minute;
    } else {
        timeSpanStr = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
    }
    return timeSpanStr;
}

/**
 *
 * @param value
 * @returns {string}
 */
export  function bigNumberTransform (value) {
  const newValue = ['', '', '']
  let fr = 1000
  let num = 3
  let text1 = ''
  let fm = 1
  while (value / fr >= 1) {
    fr *= 10
    num += 1
  }
  if (num <= 4) { // 千
    newValue[0] = parseInt(value / 1000) + ''
    newValue[1] = '千'
  } else if (num <= 8) { // 万
    text1 = parseInt(num - 4) / 3 > 1 ? '千万' : '万'
    // tslint:disable-next-line:no-shadowed-variable
    fm = text1 === '万' ? 10000 : 10000000
    if (value % fm === 0) {
      newValue[0] = parseInt(value / fm) + ''
    } else {
      newValue[0] = parseFloat(value / fm).toFixed(1) + ''
    }
    newValue[1] = text1
  } else if (num <= 16) { // 亿
    text1 = (num - 8) / 3 > 1 ? '千亿' : '亿'
    text1 = (num - 8) / 4 > 1 ? '万亿' : text1
    text1 = (num - 8) / 7 > 1 ? '千万亿' : text1
    // tslint:disable-next-line:no-shadowed-variable
    fm = 1
    if (text1 === '亿') {
      fm = 100000000
    } else if (text1 === '千亿') {
      fm = 100000000000
    } else if (text1 === '万亿') {
      fm = 1000000000000
    } else if (text1 === '千万亿') {
      fm = 1000000000000000
    }
    if (value % fm === 0) {
      newValue[0] = parseInt(value / fm) + ''
    } else {
      newValue[0] = parseFloat(value / fm).toFixed(2) + ''
    }
    newValue[1] = text1
  }
  if (value < 1000) {
    newValue[0] = value + ''
    newValue[1] = ''
  }
  return newValue.join('')
}

/**
 * 剪切板
 * @param event
 */
export function setClipboardText(event) {
    event.preventDefault();//阻止元素发生默认的行为（例如，当点击提交按钮时阻止对表单的提交）。
    var node = document.createElement('div');
    //对documentfragment不熟，不知道怎么获取里面的内容，用了一个比较笨的方式
    node.appendChild(window.getSelection().getRangeAt(0).cloneContents());
    //getRangeAt(0)返回对基于零的数字索引与传递参数匹配的选择对象中的范围的引用。对于连续选择，参数应为零。
    var html = window.getSelection().getRangeAt(0) || event.target.title
    var html2 = node.innerHTML ||  event.target.title
    var htmlData = '<div>【' + html2 + '】<br />'
        + '文章地址：' + window.location.href + '<br />'
        + '平台链接：https://www.txnh.net<br />'
        + '来源：同学你好为每个想学习知识的人提供一个少走弯路的平台<br />'
        + '商业转载请联系作者获得授权，非商业转载请注明出处。<br />'
        + '</div>';
    var textData = '【' + html2 + '】\n'
        + '文章地址：' + window.location.href + '\n'
        + '平台链接：https://www.txnh.net\n'
        + '来源：学习512-致力于帮助有梦想的年轻人获取学习价值\n'
        + '商业转载请联系作者获得授权，非商业转载请注明出处。\n';
    if (event.clipboardData) {
        event.clipboardData.setData("text/html", htmlData);
        event.clipboardData.setData("text/plain", textData);
    } else if (window.clipboardData) { //window.clipboardData的作用是在页面上将需要的东西复制到剪贴板上，提供了对于预定义的剪贴板格式的访问，以便在编辑操作中使用。
        return window.clipboardData.setData("text", textData);
    }
}

/**
 * 图片加载
 * @param src
 * @param callback
 */
export function loadingImage(src, callback) {
    var img = new Image();
    img.src = src;
    if (img.complete) {
        callback.call(img, true);
    } else {
        img.onload = function () {
            callback.call(img, true);
        };
        img.onerror = function () {
            callback.call({}, false);
        };
    }
}

/**
 * 等比例获取图片宽度和高度
 * @param img
 * @param iwidth
 * @param iheight
 * @returns {{}}
 */
export function resizeImg(img, iwidth, iheight) {
    var image = img;
    var boxWH = {};
    if (image.width > 0 && image.height > 0) {
        boxWH.width = image.width;
        boxWH.height = image.height;
        if (boxWH.width > iwidth) {
            boxWH.height = (boxWH.height * iwidth) / boxWH.width;
            boxWH.width = iwidth;

        }
        if (boxWH.height > iheight) {
            boxWH.width = (boxWH.width * iheight) / boxWH.height;
            boxWH.height = iheight;
        }
    }
    return boxWH;
}

/**
 * 随机颜色
 * @returns {string}
 */
export const getRandomColor = function () {
    return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
}


/**
 * 判断是否是pc还是手机
 * @returns {boolean}
 * @constructor
 */
export function IsPC() {
    var userAgentInfo = navigator.userAgent;
    var Agents = ["Android", 'phone',
        "iPhone",
        "Windows Phone",
        "Symbian",
        "WebOS",
        "BrowserNG",
        "wOSBrowser",
        "wOSBrowser",
        "Fennec",
        "JUC",
        "MQQBrowser",
        "IEMobile",
        "BlackBerry",
        "Mobile",
        "ios",
        "pod",
        "pad",
        "SymbianOS", "Windows Phone", "iPad", "iPod"];
    var flag = true;
    for (var v = 0; v < Agents.length; v++) {
        if (userAgentInfo.indexOf(Agents[v]) > 0) {
            flag = false;
            break;
        }
    }
    return flag;
}


/**
 * 秒-分秒
 * @param s
 * @returns {string}
 */
export function secondsFormat(s) {
    var day = Math.floor(s / (24 * 3600)); // Math.floor()向下取整
    var hour = Math.floor((s - day * 24 * 3600) / 3600);
    var minute = Math.floor((s - day * 24 * 3600 - hour * 3600) / 60);
    var second = s - day * 24 * 3600 - hour * 3600 - minute * 60;
    hour = hour < 10 ? '0' + hour : hour;
    minute = minute < 10 ? '0' + minute : minute;
    second = second < 10 ? '0' + second : second;
    if (hour <= 0) {
        return minute + ":" + second;
    } else {
        return hour + ":" + minute + ":" + second;
    }
}

/**
 * 错误图片加载
 * @param obj
 */
export function imgError(obj) {
    obj.src = "/assert/images/nodata.png";
}

/**
 * 获取范围随机数
 * @param min
 * @param max
 * @returns {*}
 */
export function getRandomrange(min,max){
    return Math.floor(Math.random() * (max - min + 1)) + min;
}


/**
 * 根据id获取dom节点
 * @param min
 * @param max
 * @returns {*}
 */
export function getDom(id){
    return document.querySelector("#"+id)
}



export function getTimeOfDay() {
    const hours = new Date().getHours();
    if (hours < 6) {
        return '凌晨好！';
    } else if (hours < 12) {
        return '早上好！';
    } else if (hours < 18) {
        return '下午好！';
    } else if (hours < 24) {
        return '晚上好！';
    }
}

export function daysUntilBirthday  (d){
    var birthday = new Date(d)
    // 创建一个新的Date对象表示今天
    var today = new Date();
    // 创建一个新的Date对象表示生日
    var birthdayThisYear = new Date(today.getFullYear(), birthday.getMonth(), birthday.getDate());
    // 如果今天的日期还没有过今年的生日日期，则直接使用今年的生日
    if (today.getTime() < birthdayThisYear.getTime()) {
        return Math.ceil((birthdayThisYear.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
    } else {
        // 生日已过，计算距离下一个生日
        var nextBirthday = new Date(today.getFullYear() + 1, birthday.getMonth(), birthday.getDate());
        return Math.ceil((nextBirthday.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
    }
}



// 动态加载外部js
// @param RESOURCE_LIST 外部地址集合["address"]
export function loadVoLteResourceList (RESOURCE_LIST, success) {
    return new Promise(r => {
        RESOURCE_LIST.reduce((res, el) => res.then(() => loadScript(el)), Promise.resolve()).then(() => {
            r()
        }).catch((error) => {
            console.error('外呼VoLTE sdk 前置 js 资源加载失败:', error.name, error.message)
            return Promise.reject(error)
        })
    })
}

export function loadScript (url) {
    return new Promise((resolve, reject) => {
        const script = document.createElement('script')
        script.onload = () => resolve()
        script.onerror = () => reject(new Error(`Load script from ${url} failed`))
        script.src = url
        const head =
            document.head || document.getElementsByTagName('head')[0]
        ;(document.body || head).appendChild(script)
    })
}

export function loadStyleSheet (url) {
    return new Promise((resolve, reject) => {
        const script = document.createElement('link')
        script.onload = () => resolve()
        script.onerror = () => reject(new Error(`Load script from ${url} failed`))
        script.rel = "stylesheet"
        script.type = "text/css"
        script.href = url
        const head =
            document.head || document.getElementsByTagName('head')[0]
        ;(document.body || head).appendChild(script)
    })
}

// 专门加载百度地图
export function loadBMap (ak) {
    return new Promise(function (resolve, reject) {
        if (typeof BMap !== 'undefined') {
            resolve(BMap)
            return true
        }
        window.onBMapCallback = function () {
            resolve(BMap)
        }
        let script = document.createElement('script')
        script.type = 'text/javascript'
        script.src = 'http://api.map.baidu.com/api?v=2.0&ak=' + ak + '&__ec_v__=20190126&callback=onBMapCallback'
        script.onerror = reject
        document.head.appendChild(script)
    })
}
